package com.qyl.sever_rpc.proxy.tem2;

import com.qyl.sever_rpc.proxy.tem1.User;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * jdk动态代理
 * */
public class JdkProxy<T> implements InvocationHandler {

    private T target;

    public JdkProxy(T obj) {
        this.target = obj;
    }


    public T newProxy() throws Exception {

//        return Proxy.newProxyInstance(
//                Person.class.getClassLoader(),
//                new Class<?>[]{Person.class},
//                this);

        /**
         * target.getClass().getInterfaces()是获取实现接口的class的数组
         * new Class<?>[]{Person.class},  这个参数只能接口的class
         * */
        // 返回代理对象
        return (T) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);

////        Proxy.newProxyInstance其实就是对下面代码的封装
//        //使用Proxy类的getProxyClass静态方法生成一个动态代理类renterProxy
//        Class<?> renterProxyClass = Proxy.getProxyClass(target.getClass().getClassLoader(), new Class<?>[]{target.getClass()});
//        //获取代理类renterProxy的构造器，参数为InvocationHandler
//        Constructor<?> constructor = renterProxyClass.getConstructor(InvocationHandler.class);
//        //使用构造器创建一个代理类实例对象
//        return constructor.newInstance(this);
    }

    //创建代理对象,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}
